﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using BlackEagleClient.DatingReference;
using BlackEagleLibrary;

namespace BlackEagleClient
{
    public partial class Profile : System.Web.UI.Page
    {
        List<PersonComposite> items = new List<PersonComposite>();
        IEnumerable<PersonComposite> Items
        {
            get { return items; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            //Kontrollera om besökaren är inloggad
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                //Spara ner den inloggade användarens ID i en variabel
                Guid id = new Guid(WebProfile.Current.ID);

                using (DatingServiceClient client = new DatingServiceClient())
                {
                    //Kod för hantera/räkna nya vänansökan och nya meddelanden
                    Label msgLabel = (Label)Master.FindControl("loginViewMasterCount").FindControl("lblCountMsg");
                    if (msgLabel != null)
                    {
                        int counter = client.CountNewMessages(id);
                        msgLabel.Text = counter.ToString();
                    }

                    Label friendLabel = (Label)Master.FindControl("loginViewMasterCount").FindControl("lblCountFriend");
                    if (friendLabel != null)
                    {
                        int counter = client.CountNewFriends(id);
                        friendLabel.Text = counter.ToString();
                    }
                    
                }

                //Kontroll av giltigt Guid i queryString
                Guid queryId;
                if (Guid.TryParse(Request.QueryString["id"], out queryId))
                {
                    CheckIfHideFriendReq(queryId);
                    ScriptManager1.RegisterAsyncPostBackControl(commentButton);
                    GetProfile();
                }

                else
                {
                    //Om Guid i queryString är ogiltig skickas användaren till startsidan
                    Response.Redirect("Default.aspx");
                }
                
            }
            else
            {
                //Om besökaren inte är inloggad skickas hen till inloggningssidan
                Response.Redirect("/account/Login.aspx");
            }
            
        }

        /// <summary>
        /// Om användaren är inne på sin egen profil, eller på en väns profil ska inte knappen för att ansöka om vänskap visas.
        /// </summary>
        /// <param name="queryId"></param>
        public void CheckIfHideFriendReq(Guid queryId)
        {
            using (DatingServiceClient client = new DatingServiceClient())
            {
                Guid id = new Guid(WebProfile.Current.ID);
                if (id == queryId)  //Om användaren är inne på sin egen profil
                {
                    btnFriendReq.Visible = false;
                }

                else if (client.CheckForFriendship(id, queryId)) //Om användaren redan är vän med använadaren vars profil användaren besöker
                {
                    btnFriendReq.Visible = false;
                }
            }
        }

        /// <summary>
        /// Hämtar profilen med Guid i queryString
        /// </summary>
        public void GetProfile()
        {
            using (DatingServiceClient client = new DatingServiceClient())
            {
                Guid id = Guid.Parse(Request.QueryString["id"]);

                PersonComposite p = client.GetProfile(id);

                if (p.ID != Guid.Empty) //Om returen är en giltig användare så visas datan
                {
                    items.Add(p);

                    ProfileDataList.DataSource = items;
                    ProfileDataList.DataBind();

                    GetComments();
                }
                else
                {
                    //Returnerar Guid från queryString en ogiltig användare (alltså finns inte användaren i databasen) skickas man till startsidan.
                    Response.Redirect("Default.aspx");
                }

            }
            
        }
        

        /// <summary>
        /// Kallar på CalculateAge i CustomMethods som räknar ut ålder utifrån ett datum
        /// </summary>
        /// <param name="birthday"></param>
        /// <returns></returns>
        public string CalculateAge(DateTime birthday)
        {
            return CustomMethods.CalculateAge(birthday);
        }

        /// <summary>
        /// Returnerar en sträng ("Male" eller "Female") beroende på värdet i sex
        /// </summary>
        /// <param name="sex"></param>
        /// <returns></returns>
        public string GetSex(int sex)
        {
            return CustomMethods.GetSex(sex);
        }

        /// <summary>
        /// Metod som sköter kommenteringen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void commentButton_Click(object sender, EventArgs e)
        {
            //Kontrollerar att användaren fortfarande är inloggad (sessionen kan ha gått ut)
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (!String.IsNullOrWhiteSpace(commentTxt.Text.ToString()) && commentTxt.Text.Length < 200)
                {
                    //Skapar ett WallMessageComposite-objekt och fyller den med datan för kommentaren
                    WallMessageComposite wc = new WallMessageComposite();
                    wc.Content = commentTxt.Text;
                    wc.Sender = Guid.Parse(WebProfile.Current.ID);
                    wc.Receiver = Guid.Parse(Request.QueryString["id"]);
                    wc.SendDate = DateTime.Now;

                    using (DatingServiceClient client = new DatingServiceClient())
                    {
                        //Kalla på SendWallMessage i WCF:en för att spara kommentaren
                        client.SendWallMessage(wc);
                    }
                    errorLabel.Text = "";
                    GetComments();
                }
                else
                {
                    errorLabel.Text = "Comment cant be null or longer than 200 characters";
                }
            }
            else
            {
                //Om sessionen gått ut (eller besökaren inte vara inloggad av någon anledning) så skickas besökaren till inloggningssidan
                Response.Redirect("/account/Login.aspx");
            }
            
            
        }

        /// <summary>
        /// Hämtar alla kommentarer för en användares profil och visa kommentar med information om avsändaren
        /// </summary>
        private void GetComments()
        {
            List<WallMessageComposite> messages = new List<WallMessageComposite>();
            List<PersonComposite> persons = new List<PersonComposite>();

            using(DatingServiceClient client = new DatingServiceClient()) 
            {
                //messages fylls med alla kommentarer (DirectMessageComposite)
                messages = client.GetWallMessages(Guid.Parse(Request.QueryString["id"]));
                //Skapar en list<Object> som senare fylls med anonyma objekt
                List<Object> messageObjects = new List<Object>();
                Guid id;
                int i = 0;

                foreach (var msg in messages)
                {
                    //Hämtar Person-objekt för varje avsändare i en kommentar
                    persons.Add(client.GetProfile(msg.Sender));
                }

                foreach (var msg in messages)
                {
                    //Går igenom alla DirectMessage (kommentar) och Person (avsändare) och skapar anonyma objekt som innehåller förnamn, efternamn och profilbild (från Person) och datum och meddelande (från DirectMessage)
                    id = messages[i].Sender;
                    WallMessageComposite wc = messages[i];
                    var query = persons.Where(x => x.ID.Equals(id)).Select(x => new { Name = x.Fnamn + " " + x.Enamn, Sex = x.Sex, AuthorPicture = x.PictureUrl, SubmitTime = wc.SendDate, Message = wc.Content }).First();
                    messageObjects.Add(query);
                    i++;
                }

                //Binder kommentarerna till commentList
                commentList.DataSource = messageObjects;
                commentList.DataBind();

            }

       
        }

        /// <summary>
        /// Kallar på CheckImg i CustomMethods för att kontrollera om en bilds URL är giltig eller inte
        /// Om den inte är giltig så returneras en alternativ bild, beroende på kön
        /// </summary>
        /// <param name="url"></param>
        /// <param name="sex"></param>
        /// <returns></returns>
        public string CheckImg(string url, int sex)
        {
            return CustomMethods.CheckImg(url, sex);
        }

        /// <summary>
        /// Knapp för att visa panelen som innehåller textfält för att skicka ett privat(direkt)meddelande (DirectMessage)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DMBtn_Click(object sender, EventArgs e)
        {
            DirectMessagePanel.Visible = true;
            DirectMessageTitleTxt.Text = "";
            DirectMessageTxt.Text = "";
        }

        /// <summary>
        /// Lyssnare för knappen som användaren trycker på när ett DirectMessage ska skickas
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void SendDMBtn_Click(object sender, EventArgs e)
        {
            //Kontrollera att användaren är inloggad (annars har sessionen gått ut eller besökaren är inte tillåten här)
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                    using (DatingServiceClient client = new DatingServiceClient())
                    {
                        //Ett DirectMessageComposite-objekt skapas och fylls med data från formuläret eller skapas nu
                        DirectMessageComposite dmc = new DirectMessageComposite();
                        dmc.Content = DirectMessageTxt.Text.ToString();
                        dmc.Sender = Guid.Parse(WebProfile.Current.ID);
                        dmc.Receiver = Guid.Parse(Request.QueryString["id"]);
                        dmc.Title = DirectMessageTitleTxt.Text.ToString();
                        dmc.SendDate = DateTime.Now;
                        dmc.IsRead = false;

                        //"Skickar" (Sparar) meddelandet
                        client.SendMessage(dmc);
                    }
            }
            //Döljer panelen nu när meddelandet har skickats
            DirectMessagePanel.Visible = false;
        }

        /// <summary>
        /// Lyssnare för vänansökan (FriendRequest)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnFriendReq_Click(object sender, ImageClickEventArgs e)
        {
            //Kontroll att användaren fortfarande är online (annars har sessionen gått ut eller så är besökaren inte tillåten här) 
            if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                //Skapa Guid som ska sparas i en Friendship-objekt (friend1 är alltid personen som frågat och friend2 personen som fått frågan)
                    Guid friend1 = Guid.Parse(WebProfile.Current.ID); //Den inloggande användaren
                    Guid friend2 = Guid.Parse(Request.QueryString["id"]); //Profilen som användaren är inne på

                    using (DatingServiceClient client = new DatingServiceClient())
                    {
                        //Ett Friendship skapas genom att ange id på det två Person som ingår i Friendship
                        client.FriendRequest(friend1, friend2);
                        //Sidan laddas om
                        Response.Redirect("Profile.aspx?id="+Request.QueryString["id"]);
                    }

                    
                    
                }
            else
            {
                //Hittas ingen inloggad skickas besökaren till inloggningssidan
                Response.Redirect("/account/Login.aspx");
            }
        }

    }
}